/**
 * @file "personnage.h"
 * @author Margot FARGIER, FAURE Adrien
*/


#ifndef __PERSONNAGE_H
#define __PERSONNAGE_H

#include "vecteur.h"
#include <stdlib.h>
#include <stdio.h>


 /**
 * @brief Structure du personnage incarné par le joueur.
 * @details
 * @var Vect acceleration l'acceleration du personnage
 * @var Vect vitesse Vitesse du personnage
 * @var int saut Booléen, vrai si le personnage est en l'air, faux sinon (1 : vrai , 0 faux)
 * @var int teleportation
 * @var int course, vrai si le personnage est en train de courir
 * @warning la strucure n'est pas encore complete, on la modifiera au fure et a mesure pour plus de comprehension
*/
typedef struct sPersonnage
{
	Vect acceleration, vitesse;
	float posX, posY;
	int saut;
	int teleportation;
	int course;
} Personnage;

/**
 * @brief Initialisation de la structure sPersonnage
 * @detail Le personnage doit etre declaré avant l'appel à cette fonction, il est initalisé aux positions x et y. et acceleration et vitesse sont null
 * @return none
 * @param[in-out] Personnage*
 * @param[in] float (x)
 * @param[in] float (y)
*/
void personnageInit(Personnage *,float , float );

/**
 * @brief Detruis la structure personnage passé en paramètre
 * @details La memoire alloué pour Personnage * sera surpprimer, ainsi que ces autre variable.
 * @param[in-out] Personnage *
*/
void personnageDetruire(Personnage *);

/**
 * @brief Deplace le personnage à sa nouvelle position
 * @details La nouvelle position du personnage est pour posX  :vitesse.x + acceleration.x. (resp pour posY)
 * @param[in-out] Personnage *
 * @return none
 * @warning Cette fonction ne gère en aucun cas les colisions, elle modifie uniquement la valeur de posX et posY.
*/

void personnageDeplacement(Personnage *);

/**
 * @brief Deplace le personnage à droite
 * @details Ajoute une acceleration au personnage vers la droite
 * c'est à dire diminue la valeur de acceleration.x
 * @param[in-out] Personnage *
 * @return none
*/
void personnageDroite(Personnage *);

/**
 * @brief Deplace le personnage à gauche
 * @details Ajoute une acceleration au personnage vers la gauche
 * c'est à dire augmente la valeur de acceleration.x
 * @param[in-out] Personnage *
 * @return none
*/
void personnageGauche(Personnage *);

/**
 * @brief Fait sauter le personnage
 * @details Ajoute une vitesse vers le haut (diminue la valeur de vitesse.y)
 * @param[in-out] Personnage*
 * @return none
*/
void personnageSauter(Personnage *);


/**
 * @brief Decelere l'acceleration du personnage
 * @details
 * @param[in-out] Personnage*
 * @return none
 */
void personnageDeceleration(Personnage*);


/**
 * @brief test de regression relatif au module personnage
*/
void personnageTestRegression();

/***********************************************  accesseur et  mutateur ********************************************************/



/**
 * @brief Retourne le vecteur vitesse de la structure Personnage passé en paramètre
 * @param[in] const Personnage *
 * @return const Vect *
*/
const Vect * personnageGetVitesse(const Personnage *);

/**
 * @brief Change la variable Vect vitesse de la structure personnage passé en paramètre
 * @param[in-out] Personnage *
 * @param[in] const Vect *
 * @return none
*/
void personnageSetVitesseVect(Personnage *,const Vect *);

/**
 * @brief Change les variable X et Y  du vecteur vitesse d epersonnage
 * @param[in-out] Personnage *
 * @param[in] const Vect *
 * @return none
*/
void personnageSetVitesseXY(Personnage *,float x, float y);

/**
 * @brief change la valeur X du vecteur Vitesse
 * @param[in-out] Personnage*
*/
void personnageSetVitesseX(Personnage *pPersonnage,float x);

/**
 * @brief change la valeur Y du vecteur Vitesse
 * @param[in-out] Personnage*
*/
void personnageSetVitesseY(Personnage *pPersonnage,float x);




/**
 * @brief Retourne la varariable acceleration de Personnage *
 * @param[in] const Personnage *
 * @return const Vect *
*/
const Vect * personnageGetAcceleration(const Personnage *);

/**
 * @brief La variable acceleration du personnage passé en parametre prend la valeur du vecteur passé en paramètre
 * @details
 * @param[in-out] Personnage*
 * @param[in] const Vect *
 * @return none
*/
void personnageSetAccelerationVect(Personnage *,const Vect *);
/**
 * @brief Change les variable X et Y  du vecteur Acceleration de personnage
 * @param[in-out] Personnage *
 * @param[in] const Vect *
 * @return none
*/
void personnageSetAccelerationXY(Personnage *,float x, float y);

/**
 * @brief change la valeur X du vecteur Acceleration
 * @param[in-out] Personnage*
*/
void personnageSetAccelerationX(Personnage *pPersonnage,float x);

/**
 * @brief change la valeur Y du vecteur Acceleration
 * @param[in-out] Personnage*
*/
void personnageSetAccelerationY(Personnage *pPersonnage,float x);









/**
 * @brief Retourne la variable posX de la structure personnage passé en paramètre
 * @param[in] Personnage *
 * @return float
*/
float personnageGetPosX(const Personnage *);

/**
 * @brief Retourne la variable posY de la structure personnage passé en paramètre
 * @param[in] Personnage *
 * @return float
*/
float personnageGetPosY(const Personnage *);

/**
 * @brief Modifie la valeur posX de la structure personnage passé en paramètre par le float egalement passé en paramètre
 * @param[in-out] Personnage *
 * @param[in] float
 * @return none
*/
void personnageSetX(Personnage * , float );

/**
 * @brief Modifie la valeur posY de la structure personnage passé en paramètre par le float egalement passé en paramètre
 * @param[in-out] Personnage *
 * @param[in] float
 * @return none
*/
void personnageSetY(Personnage * , float );



/**
 * @brief Change la valeur du booléen course de la structure personnage passé en paramètre
 * @param[in-out] Personnage*
 * @param[in] int
 * @return none
*/
void personnageSetCourse(Personnage *pPersonnage, int);

/**
 * @brief Retourne la valeur de la variable course du personnage passé en paramètre
 * @param[in] const Personnage *
 * @return int 0 ou 1
*/
int personnageGetCourse(const Personnage *pPersonnage);

/**
 * @brief change la variable teleportation à la nouvelle valeur
*/
void personnageSetTeleportation(Personnage *, int);

/**
 * @brief retourne la avariable teleportation de personnage
 * @return int
 */
int personnageGetTeleportation(const Personnage *);

/**
 * @brief Change la valeur du booléen saut de la structure personnage passé en paramètre
 * @param[in-out] Personnage*
 * @param[in] int
 * @return none
*/
void personnageSetSaut(Personnage *, int );

/**
 * @brief Retourne la valeur de la variable saut du personnage passé en paramètre
 * @param[in] const Personnage *
 * @return int 0 ou 1
*/
int personnageGetSaut(const Personnage *);


#endif
